接著昨天單個波的球面波公式動畫,今天要來挑戰的是兩波干涉的球面波動畫!
相信現在大家大概知道該怎麼辦了吧___
沒錯!就是兩波相加即可。
那麼就跟我一起來看看助教分享的球面波干涉動畫程式碼吧!
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
#定義球面波
def spherical_wave(A, k, r, r0, w, t): #A震幅 k波頻 r向量 r0波源的空間座標 w角頻率 t時間
dr = np.sqrt(np.dot(r-r0, r-r0)) #r跟r0之間的向量差,得出仍為向量。
#向量和向量做內積平方後取平方根得出絕對值
if dr == 0:
return 1 #防止r-r0(dr)等於0
phase = complex(0, k*dr-w*t) #k*dr為純量
#exponential使用負數complex 0為實部,後者為虛部
return A*np.exp(phase)/dr #根據球面波公式虛除以r
#定義波三維方向波速
k = 2*np.pi*3
#定義繪圖範圍
D = 5
#繪圖細緻度
N =151
#定義空間座標的2維陣列
x_list = [-D/2 +D*i/N for i in range(N)]
y_list = [-D/2 +D*j/N for j in range(N)]
#np.meshgrid產生網格 製作平面
x_2d, y_2d = np.meshgrid(x_list, y_list)
A = 1 #定義震幅
w = 2*np.pi #定義角頻率
#定義電場為2維的矩陣
E_field = np.zeros((N, N), dtype = complex)
#定義E1&E2為2維的矩陣
E1_field = np.zeros((N, N), dtype = complex)
E2_field = np.zeros((N, N), dtype = complex)
#定義動畫用的t時間範圍
t_list = [0.1*i for i in range(20)] #跑20個點
#定義畫圖區域
fig, ax = plt.subplots()
#定義r1 & r2
r1 = np.array([1, 0]) #從1,0發出的波
r2 = np.array([-1, 0]) #從-1,0發出的波
#定義動畫更新,將t帶入
def evolution(t):
ax.clear() #將上一張圖清除
#每個迴圈都會帶入x和z的數值,return R數值
for i in range(N):
for j in range(N):
r = np.array([x_2d[i,j], y_2d[i,j]])
E1_field[i, j] = spherical_wave(A, k, r, r1, w, t)
#定義電場,波源r1
E2_field[i, j] = spherical_wave(A, k, r, r2, w, t)
#定義電場,波源r2
#將E1+E2,並定義E_field:
E_field = E1_field + E2_field
#取電場的實部
E_real = E_field.real
#畫圖使用contour (not plot因為plot只能有兩筆資料,三筆資料兩個變數以上就必須用contourf)
ax.contourf(x_2d, y_2d, E_real, cmap = "gray", levels = 99) #cmap為等高線圖色階 levels等高線數
#製作動畫
ani= animation.FuncAnimation(fig, evolution, t_list)
ani.save("Spherical_wave_interference_animation.gif")
plt.show()
跑出來的圖如下:
這次改動內容有:
這次動畫看起來更魔幻了,感恩讚嘆助教!
不過我已經累到攤倒惹,明天再看看要來畫什麼吧!